//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
// cl_fit_mv - Ajusta curva de luz de binarias a dados observados utilizando
//			   Cadeias de Markov. 
//
// Qua 25 Ago 2010 16:54:40 BRT:
// - Inicio do programa. Quero tentar deixar esse programa o mais organizado 
//	possivel. Vou passar a tarefa de ler os arquivos de entrada e tudo mais
//  para classes externas e tentar fazer uma maneira inteligente de escolher
//	quais parametros serao ajustados.
// 
//+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+

#include "cl_fit_mc_v0_1.h" // Cabecalhos

#include "cl_fit_error_handle.hpp"

//Fazer libs para linkar qdo pronto!
#include "cl_fit_GSLSimplex.cpp"
#include "cl_fit_input_funcs.cpp"
#include "cl_fit_data_funcs.cpp"


int main(int argc, char **argv)
{
	
	// Lendo arquivos de entrada
	//PReader inpar(argv[1]);
	//DataReader indat(argv[2]);
	
	cout << argc << endl;
	for (int i = 0; i < argc; ++i) {
		cout << argv[i] << "  ";
	}
	cout << endl;
	
	GSL_Simplex solve(argv[1],argv[2]);

	// Mostro infos de arquivos de entrada
	solve.show_par(cout);
	solve.info();
	solve.show_FitPar(cout);
	solve.init();
		
	// Tirando f_fac1 da lista de parametros a ajustar
	// inc, M2, f2, f_fac2, f1
	 
	int i_FitPar[] = {1,1,2,2,3}; // linha do vetor de parametros a ser ajustado
	int j_FitPar[] = {0,2,0,5,0}; //	coluna do vetor de parametros a ser ajustado
	int nFitPar = 5;

	int i_PrivPar[] = {2,3}; // linha do vetor de parametros privados a cada curva de luz
	int j_PrivPar[] = {0,0}; //	coluna do vetor de parametros privados a cada curva de luz
	int nPrivPar = 2;
	
	solve.FitPar(nFitPar,i_FitPar,j_FitPar,nPrivPar,i_PrivPar,j_PrivPar);
	solve.show_FitPar(cout);
	 
	cout << "# - Initializing minimization\n";
	++solve;
	double sz0 = solve.simplex_size();
	for (int i = 0; i < 199; ++i) {
		double spl_sz = solve.simplex_size();
		double score = solve.score();
		int niter = ++solve;
		
		cout << "[" << niter <<"] - score = " << solve.score() << " - size = " << solve.simplex_size()
		<< " - dscore = " << (score - solve.score()) / score <<  " - dsize = " << (spl_sz - solve.simplex_size() ) / spl_sz  << endl;
				
		if ( (solve.simplex_size() < 1e-2))  {
			cout << "## - Success \n";
			break;
		}
	}

	solve.store_res();
	solve.store_cl();
	
	return 0;
	
}

